package webGrude.elements; import java.text.DateFormat; import java.text.NumberFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang3.LocaleUtils; import org.jsoup.nodes.Element; import webGrude.annotations.Selector; @SuppressWarnings("rawtypes") public class Instantiator { public static boolean typeIsKnown(final Class c) { return c.equals(String.class) || c.equals(Integer.class) || c.getSimpleName().equals("int") || c.equals(Float.class) || c.getSimpleName().equals("float") || c.equals(Boolean.class) || c.getSimpleName().equals("boolean") || c.equals(Link.class) || c.equals(Element.class) || c.equals(List.class) || c.equals(Date.class); } @SuppressWarnings("unchecked") public static <T> T instanceForNode( final Element node, final Selector s, final Class<T> c ) { final String attribute = s.attr(); final String format = s.format(); final String locale = s.locale(); final String defValue = s.defValue(); String value; try { if (c.equals(Element.class)) { return (T) node; } if (attribute != null && !attribute.isEmpty()) { if (attribute.equals("html")) { value = node.html(); } else if (attribute.equals("outerHtml")) { value = node.outerHtml(); } else { value = node.attr(attribute); } } else { value = node.text(); } if(!c.equals(Date.class) && format != null && !format.equals(Selector.NOVALUE) ){ final Pattern p = Pattern.compile(format); final Matcher matcher = p.matcher(value); final boolean found = matcher.find(); if(found){ value = matcher.group(1); if(value.isEmpty()){ value = defValue; } }else{ value = defValue; } } if (c.equals(String.class)) { return (T) value; } if (c.equals(Date.class)) { Locale loc = Locale.getDefault(); if(!locale.equals(Selector.NOVALUE)){ loc = LocaleUtils.toLocale(locale); } final DateFormat df = new SimpleDateFormat(format, loc); return (T) df.parse(value); } if (c.equals(Integer.class) || c.getSimpleName().equals("int")) { return (T) Integer.valueOf(value); } if (c.equals(Float.class) || c.getSimpleName().equals("float")) { if (!locale.equals(Selector.NOVALUE)) { Locale loc = LocaleUtils.toLocale(locale); final NumberFormat nf = NumberFormat.getInstance(loc); Number number = nf.parse(value); return (T) Float.valueOf(number.floatValue()); } else { return (T) Float.valueOf(value); } } if (c.equals(Boolean.class) || c.getSimpleName().equals("boolean")) { return (T) Boolean.valueOf(value); } } catch (final Exception e) { throw new WrongTypeForField(node, attribute, c, e); } return (T) value; } public static boolean typeIsVisitable(final Class<?> fieldClass) { return fieldClass.equals(Link.class); } @SuppressWarnings("unchecked") public static <T> T visitableForNode(final Element node, final Class c, final String currentPageUrl) { return (T) new Link<T>(node, c, currentPageUrl); } }